package com.cc;

import org.junit.Test;

/**
 * @Author C.
 * @Date 2019-03-31 15:52
 * <p>
 * 如果一个接口继承了另外一个接口，而这两个接口有一个相同方法签名的默认方法，那么父接口的默认方法会被覆盖。
 */
public class InterfaceTest2 {

    @Test
    public void test_son() {
        Son son = new Son();
        String name = son.getName();
        System.out.println(name);
        //最终输出结果为 Father1，可见Father2的默认方法被Father1给覆盖了。
    }

    /**
     * 还有另外一个关于接口冲突规矩
     * 编译报错，其实就是相同的默认方法有两个，不知道用哪个，这个时候你就必须实现getName默认方法
     * 可以用Father1.super.getName()去调用Father1接口的默认方法，
     * 当然也可以调用Father1接口的默认方法，只需Father2.super.getName()，
     * 可以发现子类调用某个父接口的默认方法可以通过 父接口. super. 方法这种格式调用
     */
    @Test
    public void test_son2() {
        Son2 son = new Son2();
        String name = son.getName();
        System.out.println(name);//Father3
    }
}


interface Father2 {
    default String getName() {
        return "Father2";
    }
}

interface Father3 {
    default String getName() {
        return "Father3";
    }
}

interface Father1 extends Father2 {
    default String getName() {
        return "Father1";
    }
}

class Son implements Father1 {
}

class Son2 implements Father2, Father3 {
    @Override
    public String getName() {
        return Father3.super.getName();
    }
}